class Node {
  constructor (val) {
    this.val = val
    this.left = null
    this.right = null
  }
}
function buildBinaryTree (arr) {
  return helper(arr, 0);
}

function helper (arr, index) {
  if (index >= arr.length || arr[index] === null || arr[index] === undefined) {
    return null;
  }

  const root = new Node(arr[index]);
  root.left = helper(arr, 2 * index + 1);
  root.right = helper(arr, 2 * index + 2);

  return root;
}
const root = [1, 2, 5, 3, 4, null, 6]
const binaryTree = buildBinaryTree(root)
console.log(JSON.stringify(binaryTree));
// 展开后的单链表应该同样使用 TreeNode ，其中 right 子指针指向链表中下一个结点，而左子指针始终为 null 。
// 展开后的单链表应该与二叉树 先序遍历 顺序相同。
//  
var flatten = function (root) {
  if (!root) {
    return;
  }

  // 将左子树展开为单链表
  flatten(root.left);
  // 将右子树展开为单链表
  flatten(root.right);

  const temp = root.right;
  // 将左子树作为右子树
  root.right = root.left;
  root.left = null;

  let currentNode = root;
  // 找到当前链表的末尾节点
  while (currentNode.right !== null) {
    currentNode = currentNode.right;
  }
  // 将原右子树接在当前链表的末尾
  currentNode.right = temp;
};
flatten(binaryTree)
let currentNode = binaryTree;
console.log(JSON.stringify(currentNode));
// while (currentNode) {
//   // console.log(currentNode.val);
//   currentNode = currentNode.right;
// }